CC = gcc
CFLAGS = -g -Wall -Wextra -pthread
LDFLAGS = -lpthread -lm -lmysqlclient

TARGETS = server client simulator

# 服务器相关的.o文件
SERVER_OBJS = server.o common.o cJSON.o queue.o threadpool.o log.o heartbeat.o database.o

# 客户端相关的.o文件
CLIENT_OBJS = client.o user.o common.o cJSON.o log.o heartbeat.o

# 模拟器相关的.o文件
SIMULATOR_OBJS = simulator.o common.o cJSON.o log.o heartbeat.o

# 所有.o文件
ALL_OBJS = $(SERVER_OBJS) $(CLIENT_OBJS) $(SIMULATOR_OBJS)

all: $(TARGETS)

# 单独的.o文件编译规则
server.o: server.c server.h common.h cJSON.h queue.h threadpool.h log.h heartbeat.h
	$(CC) $(CFLAGS) -c -o $@ $<

client.o: client.c client.h user.h common.h cJSON.h log.h
	$(CC) $(CFLAGS) -c -o $@ $<

simulator.o: simulator.c simulator.h common.h cJSON.h log.h heartbeat.h
	$(CC) $(CFLAGS) -c -o $@ $<

common.o: common.c common.h
	$(CC) $(CFLAGS) -c -o $@ $<

cJSON.o: cJSON.c cJSON.h
	$(CC) $(CFLAGS) -c -o $@ $<

queue.o: queue.c queue.h
	$(CC) $(CFLAGS) -c -o $@ $<

threadpool.o: threadpool.c threadpool.h
	$(CC) $(CFLAGS) -c -o $@ $<

log.o: log.c log.h
	$(CC) $(CFLAGS) -c -o $@ $<

heartbeat.o: heartbeat.c heartbeat.h
	$(CC) $(CFLAGS) -c -o $@ $<

database.o: database.c database.h
	$(CC) $(CFLAGS) -c -o $@ $<

user.o: user.c user.h
	$(CC) $(CFLAGS) -c -o $@ $<

# 目标链接规则
server: $(SERVER_OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

client: $(CLIENT_OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

simulator: $(SIMULATOR_OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

clean:
	rm -f $(TARGETS) $(ALL_OBJS)

.PHONY: all clean